iT邦幫忙

2022 iThome 鐵人賽

DAY 25
0

今天要來介紹新名詞Promise,中文翻譯是承諾!那這個名詞在JS裡有甚麼用處呢? 讓我們來看看八。首先,前幾篇我們不停地在講述著非同步的問題,當我們必須等待重遠端回來的資料,或是前一個函數執行完的結果,才能繼續做動時,這些非同步問題,而Promise就是用來處理JS非同步的語法結構。

非同步問題
JS是同步的程式語言,這代表同一個時間只能做一件事情,而遇到非同步事件的情況下,我們時常把程式碼放到最後,等待所有程式碼跑完才執行非同步事件。

console.log('網頁加載');

setTimeout(() => {
  console.log('非同步');
}, 0);

console.log('網頁結束');

在這種情況下,雖然非同步的事件在中間,且setTimeout為0,但由於是非同步的關西,會在最後才印出"非同步"。

Promise的結構

結構
Promise是一個建構出的函式,也屬於物件的一種,將promise給console.log出來我們可以看到他能夠使用的方法,包括了all、race、resolve、reject,四種方法。
而透過Promise函式new可以創建物件,透過物件可以使用then、catch、finally這三種方法,條件是要在Promise建構函式底下所建立。

const x = new Promise();

x.then();    // Promise 回傳成功時
x.catch();   // Promise 回傳失敗時
x.finally(); // 非同步執行完成。

在Promise建構函式創建時,我們必須傳入一個function當作參數,裡面包含兩個參數分別代表成功時,及失敗時的回傳做動,回傳結果後代表Promise結束。

new Promise(function(resolve, reject) { 
	resolve(); // 正確完成的回傳方法
	reject();  // 失敗的回傳方法
});

狀態
Promise介紹完了結構,我們要看到非同步處理的進度狀態,總共會有三種,讓我們來看看以下三種狀態。

  • pending:事件正在執行中,還沒取得結果。
  • resolved:事件執行完畢且成功,回傳 resolve 的內容。
  • rejected:事件執行完畢但失敗,回傳 rejected 的內容。

而我們來看一個簡單的例子。

function promise() {
  return new Promise((resolve, reject) => {
    // 隨機取得 0 or 1
    const num = Math.random() > 0.5 ? 1 : 0;

    // 1 則執行 resolve,否則執行 reject
    if (num) { 
      resolve('成功');
    }
    reject('失敗')
  });
}

建立一個函式promise(),而裡面就是一個簡單的Promise結構,透過帶入成功(resolve)與失敗(rejected)的參數,分別執行如果成功了就執行resolve,失敗執行reject。這就是一個最簡單的Promise例子!

下一篇我們要繼續介紹Promise的延伸,.then、.catch的用法。我們一起繼續努力吧。

參考資料:https://www.casper.tw/development/2020/02/16/all-new-promise/


上一篇
Day24 Javascript 異步處理函數
下一篇
Day26 Javascript Promise(2)
系列文
Javascripts惡補小教室30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言